package cn.ljy.mes.model;

import cn.ljy.common.model.BaseModel;
import cn.ljy.common.model.validate.AddWorkValidation;
import cn.ljy.common.model.validate.UpdateWorkValidation;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;

/**
 * 物料
 * @author ljy
 * @date 20240922
 * 备注：
 * 物料表和物料库存表是一对多关联，实际为一对一关联。
 * 在添加物料表记录的时候，要求同步添加物料库存表记录
 * 关联插入的SQL语句（用于初次创建物料库存表时）：
 * INSERT INTO wms_material_inventory (id,material_id, inventory_limit,inventory_lower,create_time)
 * SELECT uuid(),id,10000+FLOOR(RAND() * 10000),FLOOR(RAND() * 10000),now()
 * FROM mes_material;
 */
@ApiModel(value="物料")
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false,of = {"id"})
public class MesMaterial extends BaseModel {
    @NotNull(message = "类别不能为空")
    private MesMaterialType materialType;//物料类别
    @NotNull(groups = UpdateWorkValidation.class,message="id不能为空")
    private String id;
    @NotBlank(message = "名称不能为空")
    @Length(min = 1, max = 60, message = "名称长度必须在 {min} - {max} 之间")
    private String name;
    @Length(max = 100, message = "物料型号的长度不能超过{max}")
    private String model;//物料型号
    @Length(max = 100, message = "物料规格的长度不能超过{max}")
    private String specification;//物料规格
    @Length(max = 50, message = "物料单位的长度不能超过{max}")
    private String unit;//物料单位
    @Range(min = 0,message = "库存不能小于{min}")
    private BigDecimal price;//物料单价
    @NotNull(groups = UpdateWorkValidation.class,message = "物料类型不能为空")
    @Range(min = 0,message = "物料类型必须在不能小于{min}")
    private Short type;//物料类型（数据字典：1.成品、2.原料）
    @NotNull(message = "库存不能为空")
    @Range(min = 0,message = "库存不能小于{min}")
    private Long inventory;//库存数量，这个不是仓库的库存，而是特指从仓库领出来之后准备用于生产的存量。
    @NotNull(groups = AddWorkValidation.class,message="启用状态不能为空")
    private Boolean enabled;//是否启用,true表示启用

    //非数据库字段
    private Integer carTechnologyDetailNumber;//工艺详情数量

    public MesMaterial(String id) {
        this.id = id;
    }
}
